package com.isoft.controller;

import com.isoft.result.R;
import com.isoft.service.XmlImportService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * XML数据导入控制器
 * 提供各种XML数据导入功能的REST接口
 */
@RestController
@RequestMapping("/api/xml")
@CrossOrigin(origins = "*")
public class XmlImportController {

    private static final Logger logger = LoggerFactory.getLogger(XmlImportController.class);

    @Autowired
    private XmlImportService xmlImportService;

    /**
     * 一次性导入项目中所有XML文件
     * GET /api/xml/import-all
     */
    @PostMapping("/import-all")
    public R importAllXmlFiles() {
        logger.info("开始一次性导入所有XML文件");

        try {
            XmlImportService.ImportResult result = xmlImportService.importAllXmlFiles();

            if (result.getFailedFiles() == 0) {
                return R.ok(result);
            } else {
                return R.ok(result);
            }
        } catch (Exception e) {
            logger.error("导入所有XML文件失败", e);
            return R.error("导入失败: " + e.getMessage());
        }
    }

    /**
     * 按消息类型导入XML文件
     * POST /api/xml/import-by-type?messageType=BASE-APUE
     */
    @PostMapping("/import-by-type")
    public R importXmlByMessageType(@RequestParam String messageType) {
        logger.info("开始按消息类型导入XML文件: {}", messageType);

        try {
            XmlImportService.ImportResult result = xmlImportService.importXmlByMessageType(messageType);
            return R.ok(result);
        } catch (Exception e) {
            logger.error("按消息类型导入XML文件失败: {}", messageType, e);
            return R.error("导入失败: " + e.getMessage());
        }
    }

    /**
     * 上传单个XML文件并导入
     * POST /api/xml/upload
     */
    @PostMapping("/upload")
    public R uploadAndImportXmlFile(@RequestParam("file") MultipartFile file) {
        logger.info("开始导入上传的XML文件: {}", file.getOriginalFilename());

        try {
            if (file.isEmpty()) {
                return R.error("上传的文件为空");
            }

            if (!file.getOriginalFilename().toLowerCase().endsWith(".xml")) {
                return R.error("只支持XML文件格式");
            }

            XmlImportService.ImportResult result = xmlImportService.importUploadedFile(file);

            if (result.getFailedFiles() == 0) {
                return R.ok(result);
            } else {
                return R.error("文件导入失败: " + String.join(", ", result.getErrorMessages()));
            }
        } catch (Exception e) {
            logger.error("上传文件导入失败: {}", file.getOriginalFilename(), e);
            return R.error("导入失败: " + e.getMessage());
        }
    }

    /**
     * 从指定路径导入XML文件
     * POST /api/xml/import-from-path
     */
    @PostMapping("/import-from-path")
    public R importXmlFromPath(@RequestParam String xmlFolderPath) {
        logger.info("开始从指定路径导入XML文件: {}", xmlFolderPath);

        try {
            XmlImportService.ImportResult result = xmlImportService.importXmlFromFolder(xmlFolderPath);
            return R.ok(result);
        } catch (Exception e) {
            logger.error("从指定路径导入XML文件失败: {}", xmlFolderPath, e);
            return R.error("导入失败: " + e.getMessage());
        }
    }

    /**
     * 获取可用的消息类型列表
     * GET /api/xml/message-types
     */
    @GetMapping("/message-types")
    public R getAvailableMessageTypes() {
        logger.info("获取可用的消息类型列表");

        try {
            List<String> messageTypes = xmlImportService.getAvailableMessageTypes();
            return R.ok(messageTypes);
        } catch (Exception e) {
            logger.error("获取消息类型列表失败", e);
            return R.error("获取失败: " + e.getMessage());
        }
    }

    /**
     * 清空所有导入的数据
     * DELETE /api/xml/clear-all
     */
    @DeleteMapping("/clear-all")
    public R clearAllImportedData() {
        logger.info("开始清空所有导入的数据");

        try {
            xmlImportService.clearAllImportedData();
            return R.ok("成功清空所有导入的数据");
        } catch (Exception e) {
            logger.error("清空导入数据失败", e);
            return R.error("清空失败: " + e.getMessage());
        }
    }

    /**
     * 获取导入统计信息
     * GET /api/xml/stats
     */
    @GetMapping("/stats")
    public R getImportStats() {
        logger.info("获取导入统计信息");

        try {
            // 这里可以添加统计信息的逻辑
            // 比如查询各表的记录数等
            return R.ok("功能开发中");
        } catch (Exception e) {
            logger.error("获取导入统计信息失败", e);
            return R.error("获取失败: " + e.getMessage());
        }
    }
}